package com.topvision.rxjava_retrofit.tzz.Api;

import com.topvision.rxjava_retrofit.tzz.bean.banner.BannerResponse;
import com.topvision.rxjava_retrofit.tzz.bean.collect.delete.CollectDeleteResponse;
import com.topvision.rxjava_retrofit.tzz.bean.collect.edit.CollectEditResponse;
import com.topvision.rxjava_retrofit.tzz.bean.collect.list.CollectListResponse;
import com.topvision.rxjava_retrofit.tzz.bean.collect.outsidestation.OutsideStationResponse;
import com.topvision.rxjava_retrofit.tzz.bean.collect.station.StationResponse;
import com.topvision.rxjava_retrofit.tzz.bean.collect.uncollect.UnCollectResponse;
import com.topvision.rxjava_retrofit.tzz.bean.collect.link.CollectLinkResponse;
import com.topvision.rxjava_retrofit.tzz.bean.collect.weblist.WebListResponse;
import com.topvision.rxjava_retrofit.tzz.bean.feedarticle.FeedArticleListResponse;
import com.topvision.rxjava_retrofit.tzz.bean.friend.FriendResponse;
import com.topvision.rxjava_retrofit.tzz.bean.hotkey.HotkeyResponse;
import com.topvision.rxjava_retrofit.tzz.bean.login.LoginResponse;
import com.topvision.rxjava_retrofit.tzz.bean.navigation.NavigationResponse;
import com.topvision.rxjava_retrofit.tzz.bean.projectlist.ProjectListResponse;
import com.topvision.rxjava_retrofit.tzz.bean.projecttree.ProjectTreeResponse;
import com.topvision.rxjava_retrofit.tzz.bean.register.RegisterResponse;
import com.topvision.rxjava_retrofit.tzz.bean.search.SearchResponse;
import com.topvision.rxjava_retrofit.tzz.bean.tree.TreeResponse;
import com.topvision.rxjava_retrofit.tzz.bean.treearticle.TreeArticleResponse;

import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * @author lucy
 * @date 2018-05-04 11:17
 * @description //TODO
 */

public interface WanAndroidApis {
    String BASE_URL = "http://www.wanandroid.com";
    /* 1.首页相关 */

    /**
     * 获取文章列表
     *
     * @param num 页数
     * @return Observable<FeedArticleListResponse>
     */
    @GET("/article/list/{num}/json")
    Observable<FeedArticleListResponse> getFeedArticleListData(@Path("num") int num);

    /**
     * 首页banner
     *
     * @return Observable<BannerResponse>
     */
    @GET("/banner/json")
    Observable<BannerResponse> getBannerData();

    /**
     * 常用网站
     *
     * @return Observable<FriendResponse>
     */
    @GET("/friend/json")
    Observable<FriendResponse> getFriendData();

    /**
     * 搜索热词
     *
     * @return Observable<HotkeyResponse>
     */
    @GET("/hotkey/json")
    Observable<HotkeyResponse> getHotkeyData();

    /* 2. 体系 */

    /**
     * 体系数据
     *
     * @return Observable<TreeResponse>
     */
    @GET("/tree/json")
    Observable<TreeResponse> getTreeData();

    /**
     * 体系文章
     *
     * @param num 页码：拼接在链接上，从0开始。
     * @param cid 分类的id，上述二级目录的id
     * @return Observable<TreeArticleResponse>
     */
    @GET("/article/list/{num}/json")
    Observable<TreeArticleResponse> getTreeArticleData(@Path("num") int num, @Query("cid") int cid);

    /* 3. 导航 */

    /**
     * 导航数据
     *
     * @return Observable<NavigationResponse>
     */
    @GET("/navi/json")
    Observable<NavigationResponse> getNavigationData();

    /* 4. 项目 */

    /**
     * 项目分类
     *
     * @return Observable<ProjectTreeResponse>
     */
    @GET("/project/tree/json")
    Observable<ProjectTreeResponse> getProjectTreeData();

    /**
     * 项目列表
     *
     * @param page
     * @param cid
     * @return Observable<ProjectListResponse>
     */
    @GET("/project/list/{page}/json")
    Observable<ProjectListResponse> getProjectListData(@Path("page") int page, @Query("cid") int cid);

    /* 5. 登录与注册 */

    /**
     * 登录
     *
     * @param username
     * @param password
     * @return
     */
    @POST("/user/login")
    @FormUrlEncoded
    Observable<LoginResponse> postLogin(@Field("username") String username, @Field("password") String password);

    /**
     * 注册
     *
     * @param username
     * @param password
     * @param repassword
     * @return Observable<RegisterResponse>
     */
    @POST("/user/register")
    Observable<RegisterResponse> postRegister(@Field("username") String username, @Field("password") String password, @Field("repassword") String repassword);

    /* 6. 收藏 （注意所有收藏相关都需要登录操作，建议登录将返回的cookie（其中包含账号、密码）持久化到本地即可。）*/

    /**
     * 收藏文章列表
     *
     * @param num 页码：拼接在链接中，从0开始。
     * @return Observable<CollectListResponse>
     */
    @GET("/lg/collect/list/{num}/json")
    Observable<CollectListResponse> getCollectListData(@Path("num") int num);

    /**
     * 收藏站内文章
     *
     * @param id 文章id，拼接在链接中
     * @return Observable<StationResponse>
     */
    @POST("/lg/collect/{id}/json")
    @FormUrlEncoded
    Observable<StationResponse> postStation(@Path("id") int id);

    /**
     * 收藏站外文章
     *
     * @return Observable<OutsideStationResponse>
     */
    @POST("/lg/collect/add/json")
    @FormUrlEncoded
    Observable<OutsideStationResponse> postOutsideStation(@Field("title") String title, @Field("author") String author, @Field("line") String link);

    /* 6.4 取消收藏(2种方式) */

    /**
     * 我的收藏页面（该页面包含自己录入的内容）
     * id:拼接在链接上
     * originId:列表页下发，无则为-1
     *
     * @param id
     * @return
     */
    @POST("/lg/uncollect/{id}/json")
    @FormUrlEncoded
    Observable<UnCollectResponse> postUnCollectFromMyCollect(@Path("id") int id, @Field("originId") int originId);

    /**
     * 文章列表
     */
    @POST("/lg/uncollect_originId/{id}/json")
    @FormUrlEncoded
    Observable<UnCollectResponse> postUnCollectFromList(@Path("id") int id);

    /**
     * 收藏网站列表
     *
     * @return Observable<WebListResponse>
     */
    @GET("lg/collect/usertools/json")
    Observable<WebListResponse> getWebListData();

    /**
     * 收藏网址
     *
     * @param name 名称
     * @param link 网址
     * @return Observable<CollectLinkResponse>
     */
    @POST("lg/collect/addtool/json")
    @FormUrlEncoded
    Observable<CollectLinkResponse> postCollectLink(@Field("name") String name, @Field("link") String link);

    /**
     * 编辑收藏网站
     *
     * @param id   id
     * @param name 名称
     * @param link 网址
     * @return Observable<CollectEditResponse>
     */
    @POST("lg/collect/updatetool/json")
    @FormUrlEncoded
    Observable<CollectEditResponse> postCollectEdit(@Field("id") int id, @Field("name") String name, @Field("link") String link);

    /**
     * 删除收藏
     * @param id 页码
     * @return Observable<CollectDeleteResponse>
     */
    @POST("lg/collect/deletetool/json")
    @FormUrlEncoded
    Observable<CollectDeleteResponse> postCollectDelete(@Field("id") int id);

    /**
     * 搜索
     * @param id 页码
     * @param keyword 关键字 注意：支持多个关键词，用空格隔开
     * @return Observable<SearchResponse>
     */
    @POST("article/query/{id}/json")
    @FormUrlEncoded
    Observable<SearchResponse> postSearch(@Path("id") int id, @Field("k") String keyword);
}
